package preprocessor

import (
	"fmt"
	"reflect"
)

// PreProcessor 数据预处理器定义
type PreProcessor interface {
	// Init 数据预处理器初始化函数，用于初始化预处理器（如获取特征曲线等预处理所需要的数据）
	init()
	// Process 预处理函数，传入一个数据值，返回预处理后的数据值
	Process(data float64) float64
}

// typeRegistry 类型注册表，用户添加的每个预处理器，都必须调用addToTypeRegistry添加进类型注册表，否则无法通过配置文件config.yml找到该预处理器
var typeRegistry = make(map[string]reflect.Type)

// addToTypeRegistry 把预处理器添加进类型注册表
// instance 该预处理器类型的一个实例（注意Init, ）
func addToTypeRegistry(instance interface{}) {
	typeRegistry[fmt.Sprintf("%T", instance)] = reflect.TypeOf(instance)
}

// ExistPreProcessor 检查预处理器是否存在
func ExistPreProcessor(preProcessorTypeName string) bool {
	_, ok := typeRegistry[preProcessorTypeName]
	return ok
}

// NewPreProcessor 根据预处理器类型名字，创建预处理器（已经初始化）
func NewPreProcessor(preProcessorTypeName string) PreProcessor {
	preProcessor := reflect.New(typeRegistry[preProcessorTypeName]).Interface().(PreProcessor)
	preProcessor.init()
	return preProcessor
}
